﻿using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;

namespace RecommendatioNetwork.ViewModel
{
  public class DelegateCommand: ICommand
  {
    private readonly Action<object> executeMethod = null;
    private readonly Func<object, bool> canExecuteMethod = null;

    #region costruttori
    public DelegateCommand(Action<object> executeMethod,Func<object, bool> canExecuteMethod)
    {
      this.executeMethod = executeMethod;
      this.canExecuteMethod = canExecuteMethod;
    }
    public DelegateCommand(Action<object> executeMethod)
    {
        this.executeMethod = executeMethod;
    }
    #endregion

    #region implementazione metodi di ICommand
    //Definisce il metodo che determina se il comando può essere eseguito nello stato corrente
    public bool CanExecute(object parameter)
    {
      if (canExecuteMethod == null) return true;
      return this.canExecuteMethod(parameter);
    }

    //	Definisce il metodo da chiamare quando viene richiamato il comando
    public void Execute(object parameter)
    {
      if (executeMethod == null) return;
      this.executeMethod(parameter);
    }

    //Si verifica quando vi sono delle modifiche che influiscono sull'esecuzione del comando
    public event EventHandler CanExecuteChanged
    {
        add
        {
            CommandManager.RequerySuggested += value;
        }
        remove
        {
            CommandManager.RequerySuggested -= value;
        }
    }
    #endregion

  }
}
